# -*- coding: utf-8 -*-
# Create your views here.

from private.models import *

from django.shortcuts import render_to_response, redirect
from django.contrib.auth.decorators import login_required, permission_required

# Para utilizar o MEDIA_URL devemos importar o seguinte
# e em seguida fazer:
# context_instance=RequestContext(request)
# depois de locals(),
from django.template import RequestContext
from django.views.decorators.csrf import csrf_exempt
import datetime

@login_required
def index(request):
    '''
    Exibe a página privada inicial
    '''
    
    title = "Página privada inicial"
    
    minhas_solicitacoes = Solicitacao.objects.filter(usuario = request.user).order_by('-id')
    
    # se tem permição de adicionar ocupação variável
    if request.user.has_perm('private.add_ocupacao_variavel'):
        solicitacoes = Solicitacao.objects.filter(estado = 1)
    
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    
    return render_to_response(
        'private/index.html', locals(),
        context_instance=RequestContext(request)
    )

@login_required
@csrf_exempt
def sala_solicitar_reserva(request):
    title = 'Reservas'
    
    js = 'sala'
    
    step = 0
    
    if request.POST.has_key('step'):
        step = int(request.POST['step'])
    
    if step == 1:
        sala_ = int(request.POST['sala'])
        dia = request.POST['dia']
        dia_ = request.POST['dia']
        horario_inicio = request.POST['horario_inicio']
        horario_fim = request.POST['horario_fim']
        turma_ = int(request.POST['turma'])
        evento_ = int(request.POST['evento'])
        
        dia = dia.split('/')
        dia.reverse()
#        dia = dia[0] + '-' + dia[1] + '-' + dia[2]
        
        try:
            dia = datetime.date(int(dia[0]), int(dia[1]), int(dia[2]))
        except ValueError as e:
            aviso = u'Formato de data inválido. (' + unicode(e) + ')'
            step = 0
        
        if step == 1:
            horario_inicio = horario_inicio.split(':')
            horario_fim = horario_fim.split(':')
            
            try:
                horario_inicio = datetime.time(int(horario_inicio[0]), int(horario_inicio[1]))
                horario_fim = datetime.time(int(horario_fim[0]), int(horario_fim[1]))
            except ValueError as e:
                aviso = u'Formato de hora inválido. (' + unicode(e) + ')'
                step = 0
        
        if step == 1:
        
            sala = Sala.objects.get(id = sala_)
            if turma_ == 0:
                turma = None
            else:
                turma = Turma.objects.get(id = turma_)
            
            if evento_ == 0:
                evento = None
            else:
                evento = Evento.objects.get(id = evento_)
        
        # Verificando dentre as ocupações fixas
        if step == 1:
            ocupacao = Ocupacao_Fixa.objects.filter(dia = dia.weekday(), sala = sala)
            
            if ocupacao.count() > 0:
                ocupacao = ocupacao.filter(Q(inicio__lte = dia) & Q(fim__gt = dia))
                
                if ocupacao.count() > 0:
                    ocupacao = ocupacao.filter( (Q(horario_inicio__gte = horario_inicio) & Q(horario_inicio__lt = horario_fim)) | (Q(horario_fim__gte = horario_inicio) & Q(horario_fim__lt = horario_fim)) )
                    
                    if ocupacao.count() > 0:
                        step = 0
                        aviso = 'Já existe ocupação neste local e nesta data e horário.'
            
        
        # Verificando dentre as ocupações variáveis
        if step == 1:
            ocupacao = Ocupacao_Variavel.objects.filter(data = dia, sala = sala)
                
            if ocupacao.count() > 0:
                ocupacao = ocupacao.filter( (Q(horario_inicio__gte = horario_inicio) & Q(horario_inicio__lt = horario_fim)) | (Q(horario_fim__gt = horario_inicio) & Q(horario_fim__lte = horario_fim)) )
                
                if ocupacao.count() > 0:
                    step = 0
                    aviso = 'Já existe ocupação neste local e nesta data e horário.'
            
        if step == 1:
            
            solicitacao = Solicitacao(usuario = request.user, sala = sala, dia = dia, horario_inicio = horario_inicio, horario_fim = horario_fim, turma = turma, evento = evento, estado = 1)
            solicitacao.save()
            
            request.session['mensagem'] = 'Solicitação realizada com sucesso. Você receberá uma notificação sobre a aprovação ou não da reserva.'
            
            return redirect('/private/sala/solicitar_reserva')
    
    salas = Sala.objects.all()
    turmas = Turma.objects.all()
    eventos = Evento.objects.all()
    
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    
    return render_to_response(
        'private/sala/solicitar_reserva.html', locals(),
        context_instance=RequestContext(request)
    )

@login_required
@csrf_exempt
@permission_required('private.add_ocupacao_variavel')
def sala_aceitar(request, solicitacao_id):
    solicitacao = Solicitacao.objects.filter(id = solicitacao_id, estado = 1)
    
    if solicitacao.count() > 0:
        solicitacao = solicitacao.get(id = solicitacao_id)
        
         # Verificando dentre as ocupações fixas
        ocupacao = Ocupacao_Fixa.objects.filter(dia = solicitacao.dia.weekday(), sala = solicitacao.sala)
        
        if ocupacao.count() > 0:
            ocupacao = ocupacao.filter(Q(inicio__lte = solicitacao.dia) & Q(fim__gt = solicitacao.dia))
            
            if ocupacao.count() > 0:
                ocupacao = ocupacao.filter( (Q(horario_inicio__gte = solicitacao.horario_inicio) & Q(horario_inicio__lt = solicitacao.horario_fim)) | (Q(horario_fim__gte = solicitacao.horario_inicio) & Q(horario_fim__lt = solicitacao.horario_fim)) )
                
                if ocupacao.count() > 0:
                    request.session['aviso'] = 'Já existe ocupação neste local e nesta data e horário.'
                    return redirect('/private')
            
        
        # Verificando dentre as ocupações variáveis
        ocupacao = Ocupacao_Variavel.objects.filter(data = solicitacao.dia, sala = solicitacao.sala)
            
        if ocupacao.count() > 0:
            ocupacao = ocupacao.filter( (Q(horario_inicio__gte = solicitacao.horario_inicio) & Q(horario_inicio__lt = solicitacao.horario_fim)) | (Q(horario_fim__gt = solicitacao.horario_inicio) & Q(horario_fim__lte = solicitacao.horario_fim)) )
            
            if ocupacao.count() > 0:
                request.session['aviso'] = 'Já existe ocupação neste local e nesta data e horário.'
                return redirect('/private')
        
        
        ocupacao = Ocupacao_Variavel(data = solicitacao.dia, horario_inicio = solicitacao.horario_inicio, horario_fim = solicitacao.horario_fim, turma = solicitacao.turma, evento = solicitacao.evento, sala = solicitacao.sala)
        ocupacao.save()
        
        solicitacao.estado = 2
        solicitacao.save()
        
        request.session['mensagem'] = 'Ocupação variável adicionada com sucesso.'
        
    else:
        request.session['aviso'] = 'Solicitação inexistente'
    
    return redirect('/private')
@login_required
@csrf_exempt
@permission_required('private.add_ocupacao_variavel')
def sala_recusar(request, solicitacao_id):
    solicitacao = Solicitacao.objects.filter(id = solicitacao_id, estado = 1)
    
    if solicitacao.count() > 0:
        solicitacao = solicitacao.get(id = solicitacao_id)
        solicitacao.estado = 0
        solicitacao.save()
        request.session['mensagem'] = 'Solicitação recusada.'
        
    
    return redirect('/private')

@login_required
@csrf_exempt
def evento_cadastrar_evento(request):
    title = 'Eventos'
    js = 'evento'
    
    step = 0
    
    if request.POST.has_key('step'):
        step = int(request.POST['step'])
    
    if step == 1:
        semestre = request.POST['semestre']
        nome = request.POST['nome'].strip()
        descricao = request.POST['descricao'].strip()
        
        semestre = Semestre.objects.get(semestre = semestre)
        responsavel = request.user
        
        evento = Evento(semestre = semestre, nome = nome, descricao = descricao, responsavel = responsavel)
        evento.save()
        
        return redirect('/private/sala/solicitar_reserva')
    
    semestres = Semestre.objects.filter(atual = 1)
    if semestres.count() == 1:
        semestre = semestres.get(atual = 1)
    else:
        semestre = None
    
    return render_to_response(
        'private/evento/cadastrar_evento.html', locals(),
        context_instance=RequestContext(request)
    )
